package com.baijia.util;

import com.google.common.reflect.TypeToken;

import org.apache.commons.lang.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * 短信网关 http://sdk2.zucp.net:8060/webservice.asmx
 * 
 * - 10 分钟内一个手机号码最多可以提交6次 - 签名必须要有，且放到发送文案最后，之后不能有任何字符 - 长短信扣费说明 如果一次提交小于等于70字符 系统会默认为一条短信发出，扣费一条 如果大于70字符 系统会默认为长短信处理
 * 此时根据长短信前边会加（1/2）或 者（2/2）的标志 此时扣费按67字符扣一条 （内容不超过500字符）纯单字节是 140 一条，超过140个字符后，按普通长短信收费，即67个字符每条收费
 * 
 * @link http://www.genshuixue.com/
 */
public class SMSUtils {

    public static final String TEMPLATE_SEND_TEMP_ACCOUNT_PASS_MESSAGE =
        "如下师资系统临时账号已开通，请关注。用户名：{{account}}，密码：{{password}}。";

    public static final String TEMPLATE_INVITE_MESSAGE =
        "来自师资主管（{{manager}}）的邀请码： {{code}}，马上注册：{{url}}。客服热线：4000-910-910。";

    public static final String TEMPLATE_SEND_TEACHER_PASS_MESSAGE =
        "师资主管（{{manager}}）为你注册了老师账号，赶快登录激活吧，密码：{{password}}。下载跟谁学老师版APP：http://gensx.cn/SHfiOD 。客服热线：4000-910-910。";

    public static final String TEMPLATE_SEND_TEACHER_PASS_MESSAGE_FOR_ORG =
        "跟谁学入驻机构（{{organization}}）为您注册了老师账号，请在30天内登录激活，密码：{{password}}。客服热线：4000-910-910。";

    public static final int CODE_SMS_TYPE = 1; // 验证码类型
    public static final int NOTIFY_SMS_TYPE = 2; // 通知类型
    public static final int MARKETING_SMS_TYPE = 3; // 营销类型
    public static final int VOICE_SMS_TYPE = 10; // 语音验证码（content必须为数字）
    public static final int I18N_SMS_TYPE = 20; // 国际号码

    private static final TypeToken<RestfulResult<Map<String, String>>> SMS_DATA_TYPE =
        new TypeToken<RestfulResult<Map<String, String>>>() {

            /**
         * 
         */
            private static final long serialVersionUID = -4976069347546091006L;
        };

    /**
     * 使用公司的短信通道发送短信，依赖RestUtils，必须初始化
     * 
     * @param mobile 手机号
     * @param content 短信内容
     * @param messageType 短信类型，见*_SMS_TYPE常量
     * @param directSend 是否直接发送，不进入MQS，一般不需要此参数
     * @return
     */
//    public static boolean sendByChannel(String mobile, String content, Integer messageType, Integer directSend) {
//        if (StringUtils.isBlank(mobile) || StringUtils.isBlank(content) || messageType == null) {
//            return false;
//        }
//        Map<String, Object> params = new HashMap<>();
//        params.put("mobile", mobile);
//        params.put("content", content);
//        params.put("message_type", messageType.toString());
//        if (directSend != null) {
//            params.put("direct_send", directSend.toString());
//        }
//        try {
//            RestfulResult<Map<String, String>> result =
//                RestUtils.restWithDefPara("sms", "send", null, params, null, SMS_DATA_TYPE);
//            if (result.getCode() != RestfulResult.CODE_SUCCESS) {
//                return false;
//            }
//            Map<String, String> resultObj = result.getResult();
//            if (resultObj == null) {
//                return false;
//            }
//            String resultCode = resultObj.get("result_code");
//            if (resultCode == null) {
//                return false;
//            }
//            return resultCode.equals("0");
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }

    public static Map<String, String> sendByChannel(String mobile, String content, Integer messageType, Integer directSend) {
        if (StringUtils.isBlank(mobile) || StringUtils.isBlank(content) || messageType == null) {
            return null;
        }
        Map<String, Object> params = new HashMap<>();
        params.put("mobile", mobile);
        params.put("content", content);
        params.put("message_type", messageType.toString());
        if (directSend != null) {
            params.put("direct_send", directSend.toString());
        }
        try {
            RestfulResult<Map<String, String>> result =
                    RestUtils.restWithDefPara("sms", "send", null, params, null, SMS_DATA_TYPE);
            if (result.getCode() != RestfulResult.CODE_SUCCESS) {
                return null;
            }
            Map<String, String> resultObj = result.getResult();
            if (resultObj == null) {
                return null;
            }

            return resultObj;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 发送短信的简化接口，调用通知类型的短信通道
     * 
     * @param mobile 手机号
     * @param content 短信内容
     * @return
     */
    public static Map<String, String> sendByNotify(String mobile, String content) {
        return sendByChannel(mobile, content, NOTIFY_SMS_TYPE, null);
    }

    /**
     * 发送短信的简化接口，调用验证码类型的短信通道
     * 
     * @param mobile 手机号
     * @param content 短信内容
     * @return
     */
    public static Map<String, String> sendByCode(String mobile, String content) {
        return sendByChannel(mobile, content, CODE_SMS_TYPE, null);
    }

    /**
     * 发送短信的简化接口，调用市场营销类型的短信通道
     * 
     * @param mobile 手机号
     * @param content 短信内容
     * @return
     */
    public static Map<String, String> sendByMarketing(String mobile, String content) {
        return sendByChannel(mobile, content, MARKETING_SMS_TYPE, null);
    }

    /**
     * 给老师发送邀请码短信
     * 
     * @param mobile 手机号
     * @param managerName 师资姓名
     * @param code 邀请码
     * @param registUrl M站注册短链
     * @return
     */
    public static Map<String, String> sendInviteTeacher(String mobile, String managerName, String code, String registUrl) {
        return sendByMarketing(
            mobile,
            TEMPLATE_INVITE_MESSAGE.replace("{{code}}", code).replace("{{manager}}", managerName)
                .replace("{{url}}", registUrl));
    }

    /**
     * 添加特殊账号发送账号、密码短信
     * 
     * @param mobile 手机号
     * @param account 账号
     * @param password 密码
     * @return
     */
    public static Map<String, String> sendTempAccountPass(String mobile, String account, String password) {
        return sendByNotify(mobile,
            TEMPLATE_SEND_TEMP_ACCOUNT_PASS_MESSAGE.replace("{{account}}", account).replace("{{password}}", password));
    }

    /**
     * 后台添加老师，给老师发送密码短信
     * 
     * @param mobile 手机号
     * @param managerName 师资姓名
     * @param password 密码
     * @param organization 机构名称
     * @return
     */
    public static Map<String, String> sendTeacherPass(String mobile, String managerName, String password, String organization) {
        if (StringUtils.isBlank(organization)) {
            return sendByNotify(mobile,
                TEMPLATE_SEND_TEACHER_PASS_MESSAGE.replace("{{password}}", password)
                    .replace("{{manager}}", managerName));
        } else {
            return sendByNotify(mobile, TEMPLATE_SEND_TEACHER_PASS_MESSAGE_FOR_ORG.replace("{{password}}", password)
                .replace("{{organization}}", organization));
        }
    }

    public static void main(String[] args) {
        new RestUtils("543aafce91f95", "2dc7e96c3d0919112aafdb477e6002bf", "http://test-service.genshuixue.com");
        System.out.println(sendByCode("15021209494", "111111"));
    }
}
